//#define BOOST_TEST_DYN_LINK
#define BOOST_TEST_MODULE TensorDense_Iterator_Tests
#include "common.h"

#include <TensorDense.h>

BOOST_AUTO_TEST_SUITE(TensorDense_Iterator_Tests)
    
BOOST_AUTO_TEST_CASE_TEMPLATE(_TensorIterator_Default_Constructor, TEST_TYPE, numeric_types)
{
    cmpMat::TensorDense<TEST_TYPE> b =
        cmpMat::TensorDense<TEST_TYPE>::loadFromMAT("[1, 2, 3, 4 5]");
    cmpMat::TensorDense<TEST_TYPE>::Iterator iter = b.begin();
    BOOST_CHECK(*iter == 1);
    BOOST_CHECK(*(++iter) == 2);
    BOOST_CHECK(*(++iter) == 3);
    BOOST_CHECK(*(++iter) == 4);
    BOOST_CHECK(*(++iter) == 5);
    BOOST_CHECK(++iter == b.end());
    //TEST_TYPE* pntr = new TEST_TYPE[12];
    //int stride = 3;
    //cmpMat::_TensorIterator<TEST_TYPE> iter(pntr, stride);
    //BOOST_CHECK(iter.operator->() == pntr);
    //BOOST_CHECK(iter.stride() == stride);
    //delete[] pntr;
}


//
//BOOST_AUTO_TEST_CASE_TEMPLATE(_TensorIterator_Default_Constructor, TEST_TYPE, numeric_test_types)
//{
//    TEST_TYPE* pntr = new TEST_TYPE[12];
//    int stride = 3;
//    cmpMat::_TensorIterator<TEST_TYPE> iter(pntr, stride);
//    BOOST_CHECK(iter.operator->() == pntr);
//    BOOST_CHECK(iter.stride() == stride);
//    delete[] pntr;
//}
//
//BOOST_AUTO_TEST_CASE_TEMPLATE(_TensorIterator_Copy_Constructor, TEST_TYPE, numeric_test_types)
//{
//    TEST_TYPE* pntr = new TEST_TYPE[12];
//    int stride = 3;
//    cmpMat::_TensorIterator<TEST_TYPE> iter(pntr, stride);
//    cmpMat::_TensorIterator<TEST_TYPE> iter2(iter);
//    BOOST_CHECK(iter2.operator->() == pntr);
//    BOOST_CHECK(iter2.stride() == stride);
//    delete[] pntr;
//}
//
//BOOST_AUTO_TEST_CASE_TEMPLATE(_TensorIterator_Const_Copy_Constructor, TEST_TYPE, numeric_test_types)
//{
//    TEST_TYPE* pntr = new TEST_TYPE[12];
//    int stride = 3;
//    cmpMat::_TensorIterator<TEST_TYPE> iter(pntr, stride);
//    cmpMat::_TensorIterator<const TEST_TYPE> iter2(iter);
//    BOOST_CHECK(iter2.operator->() == pntr);
//    BOOST_CHECK(iter2.stride() == stride);
//    delete[] pntr;
//}
//
//BOOST_AUTO_TEST_CASE_TEMPLATE(_TensorIterator_Equal, TEST_TYPE, numeric_test_types)
//{
//    TEST_TYPE* pntr = new TEST_TYPE[12];
//    int stride = 3;
//    TEST_TYPE* pntr2 = new TEST_TYPE[12];
//    int stride2 = 3;
//    cmpMat::_TensorIterator<TEST_TYPE> iter(pntr, stride);
//    cmpMat::_TensorIterator<TEST_TYPE> iter2(pntr2, stride2);
//    cmpMat::_TensorIterator<TEST_TYPE> iter3(pntr, stride);
//    BOOST_CHECK(iter == iter);
//    BOOST_CHECK(!(iter2 == iter));
//    BOOST_CHECK(iter == iter3);
//    delete[] pntr;
//    delete[] pntr2;
//}
//
//BOOST_AUTO_TEST_CASE_TEMPLATE(_TensorIterator_Not_Equal, TEST_TYPE, numeric_test_types)
//{
//    TEST_TYPE* pntr = new TEST_TYPE[12];
//    int stride = 3;
//    TEST_TYPE* pntr2 = new TEST_TYPE[12];
//    int stride2 = 3;
//    cmpMat::_TensorIterator<TEST_TYPE> iter(pntr, stride);
//    cmpMat::_TensorIterator<TEST_TYPE> iter2(pntr2, stride2);
//    cmpMat::_TensorIterator<TEST_TYPE> iter3(pntr, stride);
//    BOOST_CHECK(!(iter != iter));
//    BOOST_CHECK(iter2 != iter);
//    BOOST_CHECK(!(iter != iter3));
//    delete[] pntr;
//    delete[] pntr2;
//}
//
//BOOST_AUTO_TEST_CASE_TEMPLATE(_TensorIterator_PostFix_Increment, TEST_TYPE, numeric_test_types)
//{
//    TEST_TYPE* pntr = new TEST_TYPE[12];
//    int stride = 3;
//    cmpMat::_TensorIterator<TEST_TYPE> iter(pntr, stride);
//    BOOST_CHECK(iter++.operator->() == pntr);
//    BOOST_CHECK(iter.operator->() == &pntr[stride]);
//    delete[] pntr;
//}
//
//BOOST_AUTO_TEST_CASE_TEMPLATE(_TensorIterator_PreFix_Increment, TEST_TYPE, numeric_test_types)
//{
//    TEST_TYPE* pntr = new TEST_TYPE[12];
//    int stride = 3;
//    cmpMat::_TensorIterator<TEST_TYPE> iter(pntr, stride);
//    BOOST_CHECK((++iter).operator->() == &pntr[stride]);
//    BOOST_CHECK(iter.operator->() == &pntr[stride]);
//    delete[] pntr;
//}
//
//BOOST_AUTO_TEST_CASE_TEMPLATE(_TensorIterator_PostFix_Decrement, TEST_TYPE, numeric_test_types)
//{
//    TEST_TYPE* pntr = new TEST_TYPE[12];
//    int stride = 3;
//    cmpMat::_TensorIterator<TEST_TYPE> iter(pntr, stride);
//    ++iter;
//    BOOST_CHECK(iter--.operator->() == &pntr[stride]);
//    BOOST_CHECK(iter.operator->() == pntr);
//    delete[] pntr;
//}
//
//BOOST_AUTO_TEST_CASE_TEMPLATE(_TensorIterator_PreFix_Decrement, TEST_TYPE, numeric_test_types)
//{
//    TEST_TYPE* pntr = new TEST_TYPE[12];
//    int stride = 3;
//    cmpMat::_TensorIterator<TEST_TYPE> iter(pntr, stride);
//    ++iter;
//    BOOST_CHECK((--iter).operator->() == pntr);
//    BOOST_CHECK(iter.operator->() == pntr);
//    delete[] pntr;
//}
//
//BOOST_AUTO_TEST_CASE_TEMPLATE(_TensorIterator_PlusEqual, TEST_TYPE, numeric_test_types)
//{
//    TEST_TYPE* pntr = new TEST_TYPE[12];
//    int stride = 3;
//    cmpMat::_TensorIterator<TEST_TYPE> iter(pntr, stride);
//    BOOST_CHECK((iter += 3).operator->() == &pntr[stride*3]);
//    BOOST_CHECK(iter.operator->() == &pntr[stride*3]);
//    delete[] pntr;
//}
//
//BOOST_AUTO_TEST_CASE_TEMPLATE(_TensorIterator_MinusEqual, TEST_TYPE, numeric_test_types)
//{
//    TEST_TYPE* pntr = new TEST_TYPE[12];
//    int stride = 3;
//    cmpMat::_TensorIterator<TEST_TYPE> iter(pntr, stride);
//    iter += 3;
//    BOOST_CHECK((iter -= 3).operator->() == pntr);
//    BOOST_CHECK(iter.operator->() == pntr);
//    delete[] pntr;
//}
//
//BOOST_AUTO_TEST_CASE_TEMPLATE(_TensorIterator_DeReference, TEST_TYPE, numeric_test_types)
//{
//    TEST_TYPE* pntr = new TEST_TYPE[12];
//    int stride = 3;
//    cmpMat::_TensorIterator<TEST_TYPE> iter(pntr, stride);
//    BOOST_CHECK(*iter == pntr[0]);
//    BOOST_CHECK(&(*iter) == pntr);
//    delete[] pntr;
//}
//
//BOOST_AUTO_TEST_CASE_TEMPLATE(_TensorIterator_Subscript, TEST_TYPE, numeric_test_types)
//{
//    TEST_TYPE* pntr = new TEST_TYPE[12];
//    int stride = 3;
//    cmpMat::_TensorIterator<TEST_TYPE> iter(pntr, stride);
//    BOOST_CHECK(&iter[0] == pntr);
//    BOOST_CHECK(&iter[-1] == &pntr[-stride]);
//    BOOST_CHECK(&iter[3] == &pntr[stride*3]);
//
//    delete[] pntr;
//}

BOOST_AUTO_TEST_SUITE_END()
